Get Data Ready
#load in workspaces from previos models
load('env.RData') #knn
load("dt_env.Rdata") #regression tree
load("my_env.Rdata") #linear regression
load("naive_env.Rdata") #naive model
Atlanta Hotel
#best models for hotel 1
best_naive #naive model
best_model_lin #linear model
best_model_knn #knn
best_model_rt #regression tree
#combine into one dataframe to have a dataframe of all predicted cancellation rates
best_model_knn$knn_predict_cxl_rate <- best_model_knn$predict_cxl_rate
best_model_rt$rt_predict_cxl_rate <- best_model_rt$predict_cxl_rate
best_naive$naive_predict_cxl_rate <- best_naive$predict_cxl_rate
hot1_best_df <- left_join(best_naive, best_model_lin, by = c('days_prior', 'stay_dt', 'product_type'))
hot1_best_df <- left_join(hot1_best_df, best_model_knn, by = c('days_prior', 'stay_dt', 'product_type'))
hot1_best_df <- left_join(hot1_best_df, best_model_rt, by = c('days_prior', 'stay_dt', 'product_type'))
avg_svv_rt <- sum(hot1_best_df$OTB_to_survive.x)/sum(hot1_best_df$OTB.x)
hot1_best_df <- data.frame(hot1_best_df$true_cxl_rate, hot1_best_df$naive_predict_cxl_rate, hot1_best_df$lin_predict_cxl_rate, hot1_best_df$knn_predict_cxl_rate, hot1_best_df$rt_predict_cxl_rate, hot1_best_df$OTB.x, hot1_best_df$OTB_to_survive.x, hot1_best_df$days_prior)
#rename columns
hot1_best_df$true_cxl_rate <- hot1_best_df$hot1_best_df.true_cxl_rate
hot1_best_df$naive_predict_cxl_rate <- hot1_best_df$hot1_best_df.naive_predict_cxl_rate
hot1_best_df$lin_predict_cxl_rate <- hot1_best_df$hot1_best_df.lin_predict_cxl_rate
hot1_best_df$knn_predict_cxl_rate <- hot1_best_df$hot1_best_df.knn_predict_cxl_rate
hot1_best_df$rt_predict_cxl_rate <- hot1_best_df$hot1_best_df.rt_predict_cxl_rate
hot1_best_df$OTB <- hot1_best_df$hot1_best_df.OTB.x
hot1_best_df$OTB_to_survive <- hot1_best_df$hot1_best_df.OTB_to_survive.x
hot1_best_df$days_prior <- hot1_best_df$hot1_best_df.days_prior
#run linear regression of all to find weights
all_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df)
summary(all_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df)
Residuals:
Min 1Q Median 3Q Max
-0.089632 -0.009137 0.000509 0.014567 0.150745
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0336080 0.0008352 40.241 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.5033760 0.0097732 51.506 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0228510 0.0029252 -7.812 0.00000000000000675 ***
knn_predict_cxl_rate -0.0463775 0.0044631 -10.391 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0402261 0.0042898 9.377 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02404 on 5272 degrees of freedom
Multiple R-squared: 0.3798, Adjusted R-squared: 0.3794
F-statistic: 807.2 on 4 and 5272 DF, p-value: < 0.00000000000000022
#new prediction given above weights
hot1_best_df$predict_cxl_rate = (hot1_best_df$naive_predict_cxl_rate*0.5033760 + hot1_best_df$lin_predict_cxl_rate*-0.0228510 + hot1_best_df$knn_predict_cxl_rate*-0.0463775 +hot1_best_df$rt_predict_cxl_rate*0.0402261)
eval(hot1_best_df)
#try to do by different days of week
hot1_best_df_dp1 <- hot1_best_df[hot1_best_df$days_prior <= 7, ]
hot1_best_df_dp2 <- hot1_best_df[hot1_best_df$days_prior <= 14, ]
hot1_best_df_dp3 <- hot1_best_df[hot1_best_df$days_prior <= 21, ]
hot1_best_df_dp4 <- hot1_best_df[hot1_best_df$days_prior <= 28, ]
hot1_best_df_dp5 <- hot1_best_df[hot1_best_df$days_prior <= 32, ]
#run linear regression based on different groups
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.061264 -0.009108 0.000501 0.006238 0.147079
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.003679 0.001098 -3.351 0.000829 ***
naive_predict_cxl_rate 0.863681 0.019334 44.672 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.017568 0.005687 3.089 0.002049 **
knn_predict_cxl_rate 0.076455 0.011246 6.799 0.0000000000159 ***
rt_predict_cxl_rate -0.002586 0.008467 -0.305 0.760087
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01732 on 1338 degrees of freedom
Multiple R-squared: 0.6729, Adjusted R-squared: 0.6719
F-statistic: 688.2 on 4 and 1338 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.049316 -0.007479 -0.001364 0.008123 0.149868
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.005310 0.000922 5.760 0.00000000947 ***
naive_predict_cxl_rate 0.813693 0.013375 60.838 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.014766 0.003947 -3.741 0.000188 ***
knn_predict_cxl_rate 0.003522 0.006778 0.520 0.603330
rt_predict_cxl_rate 0.013281 0.005880 2.258 0.024005 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01769 on 2469 degrees of freedom
Multiple R-squared: 0.6397, Adjusted R-squared: 0.6391
F-statistic: 1096 on 4 and 2469 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.080657 -0.007621 0.000347 0.008399 0.153684
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0225312 0.0008864 25.417 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.5892851 0.0112831 52.227 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0213036 0.0037598 -5.666 0.00000001576400 ***
knn_predict_cxl_rate -0.0371264 0.0055836 -6.649 0.00000000003396 ***
rt_predict_cxl_rate 0.0408696 0.0057227 7.142 0.00000000000111 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02131 on 3574 degrees of freedom
Multiple R-squared: 0.484, Adjusted R-squared: 0.4834
F-statistic: 838 on 4 and 3574 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.087130 -0.008424 0.000766 0.012125 0.151073
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0337990 0.0008596 39.318 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.4727465 0.0103214 45.802 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0195308 0.0033446 -5.840 0.00000000559 ***
knn_predict_cxl_rate -0.0480952 0.0049070 -9.801 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0480794 0.0053159 9.044 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02384 on 4660 degrees of freedom
Multiple R-squared: 0.3674, Adjusted R-squared: 0.3668
F-statistic: 676.5 on 4 and 4660 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.089632 -0.009137 0.000509 0.014567 0.150745
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0336080 0.0008352 40.241 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.5033760 0.0097732 51.506 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0228510 0.0029252 -7.812 0.00000000000000675 ***
knn_predict_cxl_rate -0.0463775 0.0044631 -10.391 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0402261 0.0042898 9.377 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02404 on 5272 degrees of freedom
Multiple R-squared: 0.3798, Adjusted R-squared: 0.3794
F-statistic: 807.2 on 4 and 5272 DF, p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.863681 + hot1_best_df_dp1$lin_predict_cxl_rate*0.017568 + hot1_best_df_dp1$knn_predict_cxl_rate*0.076455 +hot1_best_df_dp1$rt_predict_cxl_rate*-0.002586)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.813693 + hot1_best_df_dp2$lin_predict_cxl_rate*-0.014766 + hot1_best_df_dp2$knn_predict_cxl_rate*0.003522 +hot1_best_df_dp2$rt_predict_cxl_rate*0.013281)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5892851 + hot1_best_df_dp3$lin_predict_cxl_rate*-0.0213036 + hot1_best_df_dp3$knn_predict_cxl_rate*-0.0371264 +hot1_best_df_dp3$rt_predict_cxl_rate*0.0408696)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.4727465 + hot1_best_df_dp4$lin_predict_cxl_rate*-0.0195308 + hot1_best_df_dp4$knn_predict_cxl_rate*-0.0480952 +hot1_best_df_dp4$rt_predict_cxl_rate*-0.0480952)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.5033760 + hot1_best_df_dp5$lin_predict_cxl_rate*-0.0228510 + hot1_best_df_dp5$knn_predict_cxl_rate*-0.0463775 +hot1_best_df_dp5$rt_predict_cxl_rate*0.0402261)
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose naive and linear
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot1_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.052072 -0.009857 0.000823 0.007365 0.142370
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.003256 0.001104 -2.950 0.00323 **
naive_predict_cxl_rate 0.906583 0.018262 49.644 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.025763 0.005434 4.741 0.00000235 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0176 on 1340 degrees of freedom
Multiple R-squared: 0.6616, Adjusted R-squared: 0.6611
F-statistic: 1310 on 2 and 1340 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot1_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.047292 -0.007540 -0.001397 0.008652 0.149226
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0056263 0.0009133 6.161 0.000000000844 ***
naive_predict_cxl_rate 0.8224800 0.0127249 64.636 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0120550 0.0037317 -3.230 0.00125 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0177 on 2471 degrees of freedom
Multiple R-squared: 0.6388, Adjusted R-squared: 0.6385
F-statistic: 2185 on 2 and 2471 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot1_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.079794 -0.007634 0.000436 0.008833 0.153359
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0240792 0.0008663 27.795 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.5766591 0.0107459 53.663 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0205055 0.0036514 -5.616 0.0000000211 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02154 on 3576 degrees of freedom
Multiple R-squared: 0.4723, Adjusted R-squared: 0.472
F-statistic: 1600 on 2 and 3576 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot1_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.081060 -0.007912 0.001561 0.012094 0.150340
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0361052 0.0008283 43.587 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.4452861 0.0098456 45.227 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0173648 0.0033046 -5.255 0.000000155 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02421 on 4662 degrees of freedom
Multiple R-squared: 0.3472, Adjusted R-squared: 0.3469
F-statistic: 1240 on 2 and 4662 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot1_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.084839 -0.008035 0.001193 0.014580 0.149376
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0352802 0.0008219 42.927 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.4732764 0.0093814 50.448 < 0.0000000000000002 ***
lin_predict_cxl_rate -0.0183609 0.0028350 -6.476 0.000000000102 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02441 on 5274 degrees of freedom
Multiple R-squared: 0.3604, Adjusted R-squared: 0.3602
F-statistic: 1486 on 2 and 5274 DF, p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.906583 + hot1_best_df_dp1$lin_predict_cxl_rate*0.025763)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.8224800 + hot1_best_df_dp2$lin_predict_cxl_rate*-0.0120550)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5766591 + hot1_best_df_dp3$lin_predict_cxl_rate*-0.0205055)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.4452861 + hot1_best_df_dp4$lin_predict_cxl_rate*-0.0173648)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.4732764 + hot1_best_df_dp5$lin_predict_cxl_rate*-0.0183609 )
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose naive and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.056809 -0.008890 0.000887 0.005746 0.148928
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0023304 0.0009951 -2.342 0.0193 *
naive_predict_cxl_rate 0.8664133 0.0191108 45.336 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.0843757 0.0109570 7.701 0.0000000000000262 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01737 on 1340 degrees of freedom
Multiple R-squared: 0.6705, Adjusted R-squared: 0.67
F-statistic: 1364 on 2 and 1340 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.046753 -0.007020 -0.001545 0.008639 0.146088
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.00477121 0.00088580 5.386 0.0000000787 ***
naive_predict_cxl_rate 0.81186544 0.01294938 62.695 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.00004591 0.00647077 0.007 0.994
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01774 on 2471 degrees of freedom
Multiple R-squared: 0.6373, Adjusted R-squared: 0.637
F-statistic: 2171 on 2 and 2471 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.081686 -0.007493 0.000686 0.009699 0.148328
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0233960 0.0008479 27.592 < 0.0000000000000002 ***
naive_predict_cxl_rate 0.5811013 0.0107838 53.887 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.0349455 0.0054198 -6.448 0.000000000129 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02151 on 3576 degrees of freedom
Multiple R-squared: 0.4738, Adjusted R-squared: 0.4735
F-statistic: 1610 on 2 and 3576 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.088490 -0.008299 0.001919 0.012327 0.146243
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.035863 0.000819 43.789 <0.0000000000000002 ***
naive_predict_cxl_rate 0.455627 0.009412 48.411 <0.0000000000000002 ***
knn_predict_cxl_rate -0.042082 0.004818 -8.735 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02409 on 4662 degrees of freedom
Multiple R-squared: 0.3539, Adjusted R-squared: 0.3536
F-statistic: 1277 on 2 and 4662 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.091858 -0.007807 0.001936 0.014353 0.145113
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0351146 0.0008153 43.069 <0.0000000000000002 ***
naive_predict_cxl_rate 0.4789549 0.0089788 53.343 <0.0000000000000002 ***
knn_predict_cxl_rate -0.0413892 0.0043972 -9.413 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0243 on 5274 degrees of freedom
Multiple R-squared: 0.366, Adjusted R-squared: 0.3657
F-statistic: 1522 on 2 and 5274 DF, p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.8664133 + hot1_best_df_dp1$knn_predict_cxl_rate*0.0843757)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.81186544 + hot1_best_df_dp2$knn_predict_cxl_rate*0.00004591)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5811013 + hot1_best_df_dp3$knn_predict_cxl_rate*-0.0349455)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.455627 + hot1_best_df_dp4$knn_predict_cxl_rate*-0.042082)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.4789549 + hot1_best_df_dp5$knn_predict_cxl_rate*-0.0413892 )
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose rt and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.12509 -0.01471 -0.00011 0.01274 0.18342
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.027892 0.001214 22.981 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.065694 0.012750 5.152 0.000000296 ***
knn_predict_cxl_rate 0.249263 0.016368 15.229 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02738 on 1340 degrees of freedom
Multiple R-squared: 0.1814, Adjusted R-squared: 0.1801
F-statistic: 148.4 on 2 and 1340 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.138404 -0.015831 0.003126 0.014201 0.165365
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0448923 0.0009574 46.891 <0.0000000000000002 ***
rt_predict_cxl_rate 0.0888838 0.0088733 10.017 <0.0000000000000002 ***
knn_predict_cxl_rate 0.0957111 0.0101405 9.438 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02799 on 2471 degrees of freedom
Multiple R-squared: 0.097, Adjusted R-squared: 0.09627
F-statistic: 132.7 on 2 and 2471 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.133967 -0.014403 0.000928 0.013627 0.155983
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.054677 0.000828 66.038 <0.0000000000000002 ***
rt_predict_cxl_rate 0.079985 0.007432 10.762 <0.0000000000000002 ***
knn_predict_cxl_rate 0.065289 0.006837 9.549 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0285 on 3576 degrees of freedom
Multiple R-squared: 0.0764, Adjusted R-squared: 0.07589
F-statistic: 147.9 on 2 and 3576 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.127318 -0.014533 0.000188 0.016099 0.148660
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0624972 0.0007446 83.93 <0.0000000000000002 ***
rt_predict_cxl_rate 0.0690366 0.0063459 10.88 <0.0000000000000002 ***
knn_predict_cxl_rate 0.0451712 0.0054490 8.29 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02916 on 4662 degrees of freedom
Multiple R-squared: 0.0531, Adjusted R-squared: 0.05269
F-statistic: 130.7 on 2 and 4662 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot1_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.114629 -0.014184 -0.000396 0.018589 0.145191
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0667049 0.0006836 97.572 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0527287 0.0050981 10.343 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.0418080 0.0051077 8.185 0.000000000000000338 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02985 on 5274 degrees of freedom
Multiple R-squared: 0.04331, Adjusted R-squared: 0.04295
F-statistic: 119.4 on 2 and 5274 DF, p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$rt_predict_cxl_rate*0.065694 + hot1_best_df_dp1$knn_predict_cxl_rate*0.249263)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$rt_predict_cxl_rate*0.0888838 + hot1_best_df_dp2$knn_predict_cxl_rate*0.0957111)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$rt_predict_cxl_rate*0.079985 + hot1_best_df_dp3$knn_predict_cxl_rate*0.065289)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$rt_predict_cxl_rate*0.0690366 + hot1_best_df_dp4$knn_predict_cxl_rate*0.0451712)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$rt_predict_cxl_rate*0.0527287 + hot1_best_df_dp5$knn_predict_cxl_rate*0.0418080)
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
- Linear Regression and naive results in the best model
NY Hotel
#best models for hotel 2
best_naive_hot2 #naive model
best_model_lin_hot2 #linear model
best_model_knn_hot2 #knn
best_model_rt_hot2 #regression tree
#combine into one dataframe to have a dataframe of all predicted cancellation rates
best_model_knn_hot2$knn_predict_cxl_rate <- best_model_knn_hot2$predict_cxl_rate
best_model_rt_hot2$rt_predict_cxl_rate <- best_model_rt_hot2$predict_cxl_rate
best_naive_hot2$naive_predict_cxl_rate <- best_naive_hot2$predict_cxl_rate
best_model_lin_hot2$lin_predict_cxl_rate <- best_model_lin_hot2$predict_cxl_rate
hot2_best_df <- left_join(best_naive_hot2, best_model_lin_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
hot2_best_df <- left_join(hot2_best_df, best_model_knn_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
hot2_best_df <- left_join(hot2_best_df, best_model_rt_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
avg_svv_rt <- sum(hot2_best_df$OTB_to_survive.x)/sum(hot2_best_df$OTB.x)
hot2_best_df <- data.frame(hot2_best_df$true_cxl_rate, hot2_best_df$naive_predict_cxl_rate, hot2_best_df$lin_predict_cxl_rate, hot2_best_df$knn_predict_cxl_rate, hot2_best_df$rt_predict_cxl_rate, hot2_best_df$OTB.x, hot2_best_df$OTB_to_survive.x, hot2_best_df$days_prior)
#rename columns
hot2_best_df$true_cxl_rate <- hot2_best_df$hot2_best_df.true_cxl_rate
hot2_best_df$naive_predict_cxl_rate <- hot2_best_df$hot2_best_df.naive_predict_cxl_rate
hot2_best_df$lin_predict_cxl_rate <- hot2_best_df$hot2_best_df.lin_predict_cxl_rate
hot2_best_df$knn_predict_cxl_rate <- hot2_best_df$hot2_best_df.knn_predict_cxl_rate
hot2_best_df$rt_predict_cxl_rate <- hot2_best_df$hot2_best_df.rt_predict_cxl_rate
hot2_best_df$OTB <- hot2_best_df$hot2_best_df.OTB.x
hot2_best_df$OTB_to_survive <- hot2_best_df$hot2_best_df.OTB_to_survive.x
hot2_best_df$days_prior <- hot2_best_df$hot2_best_df.days_prior
#run linear regression of all to find weights
all_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df)
summary(all_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df)
Residuals:
Min 1Q Median 3Q Max
-0.181169 -0.006598 0.000914 0.005871 0.085162
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0021369 0.0004493 -4.756 0.00000201 ***
naive_predict_cxl_rate 0.6723969 0.0110257 60.985 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.3897322 0.0091050 42.804 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.0913208 0.0065264 -13.992 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0135764 0.0033473 4.056 0.00005046 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02194 on 6996 degrees of freedom
Multiple R-squared: 0.8734, Adjusted R-squared: 0.8733
F-statistic: 1.207e+04 on 4 and 6996 DF, p-value: < 0.00000000000000022
#new prediction given above weights
hot2_best_df$predict_cxl_rate = (hot2_best_df$naive_predict_cxl_rate*1.0589208 + hot2_best_df$lin_predict_cxl_rate*-0.0190952 + hot2_best_df$knn_predict_cxl_rate*-0.0816610 +hot2_best_df$rt_predict_cxl_rate*0.0050087)
eval(hot2_best_df)
#try to do by different days of week
hot2_best_df_dp1 <- hot2_best_df[hot2_best_df$days_prior <= 7, ]
hot2_best_df_dp2 <- hot2_best_df[hot2_best_df$days_prior <= 14, ]
hot2_best_df_dp3 <- hot2_best_df[hot2_best_df$days_prior <= 21, ]
hot2_best_df_dp4 <- hot2_best_df[hot2_best_df$days_prior <= 28, ]
hot2_best_df_dp5 <- hot2_best_df[hot2_best_df$days_prior <= 32, ]
#run linear regression based on different groups
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.16149 -0.00465 0.00098 0.00334 0.08825
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.00005633 0.00080767 -0.070 0.94441
naive_predict_cxl_rate 0.75426014 0.02358126 31.986 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.17832316 0.01121912 15.895 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.06215385 0.01933997 -3.214 0.00133 **
rt_predict_cxl_rate 0.03569091 0.01585239 2.251 0.02448 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01746 on 1771 degrees of freedom
Multiple R-squared: 0.7248, Adjusted R-squared: 0.7242
F-statistic: 1166 on 4 and 1771 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.179200 -0.005966 0.000497 0.005116 0.090308
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0012641 0.0007181 -1.760 0.0785 .
naive_predict_cxl_rate 0.9064140 0.0188567 48.068 <0.0000000000000002 ***
lin_predict_cxl_rate 0.2802729 0.0110043 25.469 <0.0000000000000002 ***
knn_predict_cxl_rate -0.1940328 0.0145604 -13.326 <0.0000000000000002 ***
rt_predict_cxl_rate -0.0131731 0.0142214 -0.926 0.3544
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02145 on 3314 degrees of freedom
Multiple R-squared: 0.8001, Adjusted R-squared: 0.7999
F-statistic: 3317 on 4 and 3314 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.176111 -0.007003 0.000164 0.006068 0.094363
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0003009 0.0005533 0.544 0.587
naive_predict_cxl_rate 0.8928911 0.0146451 60.968 <0.0000000000000002 ***
lin_predict_cxl_rate 0.2824946 0.0103314 27.343 <0.0000000000000002 ***
knn_predict_cxl_rate -0.2276224 0.0101513 -22.423 <0.0000000000000002 ***
rt_predict_cxl_rate 0.0061863 0.0057673 1.073 0.283
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02251 on 4833 degrees of freedom
Multiple R-squared: 0.8279, Adjusted R-squared: 0.8278
F-statistic: 5813 on 4 and 4833 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.177073 -0.007227 0.000703 0.006089 0.087768
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0015830 0.0004777 -3.314 0.000925 ***
naive_predict_cxl_rate 0.7379078 0.0119469 61.766 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.3569174 0.0095657 37.312 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.1297209 0.0073943 -17.543 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0120598 0.0037995 3.174 0.001510 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02236 on 6350 degrees of freedom
Multiple R-squared: 0.8587, Adjusted R-squared: 0.8586
F-statistic: 9648 on 4 and 6350 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate +
knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.181169 -0.006598 0.000914 0.005871 0.085162
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0021369 0.0004493 -4.756 0.00000201 ***
naive_predict_cxl_rate 0.6723969 0.0110257 60.985 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.3897322 0.0091050 42.804 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.0913208 0.0065264 -13.992 < 0.0000000000000002 ***
rt_predict_cxl_rate 0.0135764 0.0033473 4.056 0.00005046 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02194 on 6996 degrees of freedom
Multiple R-squared: 0.8734, Adjusted R-squared: 0.8733
F-statistic: 1.207e+04 on 4 and 6996 DF, p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.934751 + hot2_best_df_dp1$lin_predict_cxl_rate*-0.003968 + hot2_best_df_dp1$knn_predict_cxl_rate*-0.049040 +hot2_best_df_dp1$rt_predict_cxl_rate*0.026188)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.309082 + hot2_best_df_dp2$lin_predict_cxl_rate*-0.005892 + hot2_best_df_dp2$knn_predict_cxl_rate*-0.303214 +hot2_best_df_dp2$rt_predict_cxl_rate*-0.071875)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*1.2606622 + hot2_best_df_dp3$lin_predict_cxl_rate*-0.0174396 + hot2_best_df_dp3$knn_predict_cxl_rate*-0.3234571 +hot2_best_df_dp3$rt_predict_cxl_rate*-0.0070530)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*1.1071242 + hot2_best_df_dp4$lin_predict_cxl_rate*-0.0195308 + hot2_best_df_dp4$knn_predict_cxl_rate*-0.1379604 +hot2_best_df_dp4$rt_predict_cxl_rate*0.0009181)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*1.0589208 + hot2_best_df_dp5$lin_predict_cxl_rate*-0.0190952 + hot2_best_df_dp5$knn_predict_cxl_rate*-0.0816610 +hot2_best_df_dp5$rt_predict_cxl_rate*0.0050087)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose naive and linear
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot2_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.163076 -0.005680 0.001460 0.003808 0.086314
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0003635 0.0006572 0.553 0.58
naive_predict_cxl_rate 0.7215594 0.0153431 47.028 <0.0000000000000002 ***
lin_predict_cxl_rate 0.1778723 0.0112478 15.814 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01751 on 1773 degrees of freedom
Multiple R-squared: 0.7228, Adjusted R-squared: 0.7224
F-statistic: 2311 on 2 and 1773 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot2_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.180120 -0.006658 0.000855 0.005660 0.084257
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0039597 0.0006317 -6.268 0.000000000413 ***
naive_predict_cxl_rate 0.7135702 0.0121601 58.681 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.2946841 0.0111954 26.322 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02212 on 3316 degrees of freedom
Multiple R-squared: 0.7874, Adjusted R-squared: 0.7873
F-statistic: 6141 on 2 and 3316 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot2_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.179914 -0.007067 0.001727 0.005002 0.089718
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0017350 0.0005641 -3.076 0.00211 **
naive_predict_cxl_rate 0.6690277 0.0106695 62.705 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.2940888 0.0108480 27.110 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02367 on 4835 degrees of freedom
Multiple R-squared: 0.8097, Adjusted R-squared: 0.8097
F-statistic: 1.029e+04 on 2 and 4835 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot2_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.180946 -0.006540 0.001772 0.005464 0.087458
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0021238 0.0004848 -4.381 0.000012 ***
naive_predict_cxl_rate 0.6191760 0.0095586 64.777 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.3498547 0.0097665 35.822 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02289 on 6352 degrees of freedom
Multiple R-squared: 0.8519, Adjusted R-squared: 0.8518
F-statistic: 1.826e+04 on 2 and 6352 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate,
data = hot2_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.182342 -0.005853 0.001694 0.005637 0.085631
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0023600 0.0004527 -5.214 0.000000191 ***
naive_predict_cxl_rate 0.5942390 0.0091040 65.272 < 0.0000000000000002 ***
lin_predict_cxl_rate 0.3814505 0.0091807 41.549 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02225 on 6998 degrees of freedom
Multiple R-squared: 0.8698, Adjusted R-squared: 0.8697
F-statistic: 2.337e+04 on 2 and 6998 DF, p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.908689 + hot2_best_df_dp1$lin_predict_cxl_rate*-0.004495)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.007202 + hot2_best_df_dp2$lin_predict_cxl_rate*-0.018085)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*0.96364090 + hot2_best_df_dp3$lin_predict_cxl_rate*-0.02857291)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*0.9723992 + hot2_best_df_dp4$lin_predict_cxl_rate*-0.0287762)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*0.9807816 + hot2_best_df_dp5$lin_predict_cxl_rate*-0.0256980 )
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose naive and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.153942 -0.003982 -0.001084 0.001670 0.098483
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0042185 0.0006956 6.064 0.00000000161 ***
naive_predict_cxl_rate 0.9029219 0.0224797 40.166 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.0570108 0.0202835 -2.811 0.005 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01866 on 1773 degrees of freedom
Multiple R-squared: 0.6851, Adjusted R-squared: 0.6847
F-statistic: 1928 on 2 and 1773 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.165253 -0.008951 0.000017 0.004533 0.111381
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0011374 0.0006858 1.659 0.0973 .
naive_predict_cxl_rate 1.1392941 0.0161960 70.344 <0.0000000000000002 ***
knn_predict_cxl_rate -0.2277196 0.0149681 -15.214 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02351 on 3316 degrees of freedom
Multiple R-squared: 0.7598, Adjusted R-squared: 0.7596
F-statistic: 5243 on 2 and 3316 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.162560 -0.010644 -0.000102 0.005987 0.114476
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0015160 0.0005838 2.597 0.00944 **
naive_predict_cxl_rate 1.1318749 0.0122575 92.341 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.2393399 0.0107320 -22.301 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02419 on 4835 degrees of freedom
Multiple R-squared: 0.8013, Adjusted R-squared: 0.8012
F-statistic: 9747 on 2 and 4835 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.161216 -0.011687 -0.000641 0.006823 0.110207
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0016468 0.0005255 -3.134 0.00174 **
naive_predict_cxl_rate 1.0307178 0.0099429 103.664 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.1118948 0.0080796 -13.849 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02472 on 6352 degrees of freedom
Multiple R-squared: 0.8271, Adjusted R-squared: 0.8271
F-statistic: 1.52e+04 on 2 and 6352 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.165406 -0.011369 -0.001181 0.007260 0.108195
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0027375 0.0005033 -5.439 0.0000000555 ***
naive_predict_cxl_rate 0.9940968 0.0091327 108.850 < 0.0000000000000002 ***
knn_predict_cxl_rate -0.0636097 0.0072490 -8.775 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02471 on 6998 degrees of freedom
Multiple R-squared: 0.8394, Adjusted R-squared: 0.8394
F-statistic: 1.829e+04 on 2 and 6998 DF, p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.9029219 + hot2_best_df_dp1$knn_predict_cxl_rate*-0.0570108)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.1392941 + hot2_best_df_dp2$knn_predict_cxl_rate*-0.2277196)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*1.1318749 + hot2_best_df_dp3$knn_predict_cxl_rate*-0.2393399)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*1.0307178 + hot2_best_df_dp4$knn_predict_cxl_rate*-0.1118948)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*0.9940968 + hot2_best_df_dp5$knn_predict_cxl_rate*-0.0636097)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose rt and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp1)
Residuals:
Min 1Q Median 3Q Max
-0.121303 -0.012040 -0.003139 0.008643 0.172732
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.003713 0.001118 3.320 0.000919 ***
rt_predict_cxl_rate 0.210950 0.021879 9.642 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.478290 0.020192 23.687 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02514 on 1773 degrees of freedom
Multiple R-squared: 0.4284, Adjusted R-squared: 0.4278
F-statistic: 664.5 on 2 and 1773 DF, p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp2)
Residuals:
Min 1Q Median 3Q Max
-0.124448 -0.017053 -0.007266 0.007309 0.184341
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.003933 0.001179 3.337 0.000857 ***
rt_predict_cxl_rate 0.313697 0.022016 14.249 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.426355 0.019726 21.614 < 0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.03603 on 3316 degrees of freedom
Multiple R-squared: 0.4358, Adjusted R-squared: 0.4355
F-statistic: 1281 on 2 and 3316 DF, p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp3)
Residuals:
Min 1Q Median 3Q Max
-0.261991 -0.015219 -0.007421 0.007183 0.203211
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0125942 0.0009388 13.42 <0.0000000000000002 ***
rt_predict_cxl_rate 0.1540549 0.0096714 15.93 <0.0000000000000002 ***
knn_predict_cxl_rate 0.4895428 0.0115439 42.41 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0392 on 4835 degrees of freedom
Multiple R-squared: 0.4781, Adjusted R-squared: 0.4779
F-statistic: 2215 on 2 and 4835 DF, p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp4)
Residuals:
Min 1Q Median 3Q Max
-0.246545 -0.016321 -0.006689 0.008892 0.204088
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0147137 0.0008005 18.38 <0.0000000000000002 ***
rt_predict_cxl_rate 0.1211626 0.0065015 18.64 <0.0000000000000002 ***
knn_predict_cxl_rate 0.5143450 0.0081984 62.74 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0395 on 6352 degrees of freedom
Multiple R-squared: 0.5588, Adjusted R-squared: 0.5587
F-statistic: 4023 on 2 and 6352 DF, p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)
Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate,
data = hot2_best_df_dp5)
Residuals:
Min 1Q Median 3Q Max
-0.246634 -0.016923 -0.006714 0.010656 0.203957
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0150824 0.0007582 19.89 <0.0000000000000002 ***
rt_predict_cxl_rate 0.1152467 0.0058386 19.74 <0.0000000000000002 ***
knn_predict_cxl_rate 0.5265252 0.0073226 71.90 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.03947 on 6998 degrees of freedom
Multiple R-squared: 0.5903, Adjusted R-squared: 0.5902
F-statistic: 5042 on 2 and 6998 DF, p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$rt_predict_cxl_rate*0.210950 + hot2_best_df_dp1$knn_predict_cxl_rate*0.478290)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$rt_predict_cxl_rate*0.313697 + hot2_best_df_dp2$knn_predict_cxl_rate*0.426355)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$rt_predict_cxl_rate*0.1540549 + hot2_best_df_dp3$knn_predict_cxl_rate*0.4895428)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$rt_predict_cxl_rate*0.1211626 + hot2_best_df_dp4$knn_predict_cxl_rate*0.5143450)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$rt_predict_cxl_rate*0.1152467 + hot2_best_df_dp5$knn_predict_cxl_rate*0.5265252)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
LS0tDQp0aXRsZTogIkhvdGVsIENhbmNlbGxhdGlvbiAtIENvbWJpbmVkIE1vZGVsIg0KYXV0aG9yOiAiQ2FpdGxpbiBIb3dhbnNreSAmIFdlaSBMaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzMnDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KI19fR2V0IERhdGEgUmVhZHlfXw0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIENsZWFyIGVudmlyb25tZW50IG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zDQojcm0obGlzdCA9IGxzKGFsbCA9IFRSVUUpKSANCiMgQ2xlYXIgZW52aXJvbm1ldCBvZiBwYWNrYWdlcw0KI2lmKGlzLm51bGwoc2Vzc2lvbkluZm8oKSRvdGhlclBrZ3MpID09IEZBTFNFKWxhcHBseShwYXN0ZSgicGFja2FnZToiLCBuYW1lcyhzZXNzaW9uSW5mbygpJG90aGVyUGtncyksIHNlcD0iIiksIGRldGFjaCwgY2hhcmFjdGVyLm9ubHkgPSAjVFJVRSwgdW5sb2FkID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCg0KIyBsb2FkIHBhY2thZ2UNCmxpYnJhcnkoc2pQbG90KQ0KbGlicmFyeShzam1pc2MpDQpsaWJyYXJ5KHNqbGFiZWxsZWQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgDQpsaWJyYXJ5KGRwbHlyKSAjIGpvaW5zDQojbGlicmFyeShqYW5pdG9yKSAjIHByZXR0eSBjcm9zcy10YWJzDQpsaWJyYXJ5KGthYmxlRXh0cmEpICMgcHJldHR5IGh0bWwgdGFibGVzDQojbGlicmFyeShmb3JtYXR0YWJsZSkNCiNsaWJyYXJ5KGdyaWRFeHRyYSkNCiNsaWJyYXJ5KHNjYWxlcykNCiNsaWJyYXJ5KHBhc3RlY3MpDQojbGlicmFyeShHR2FsbHkpDQojbGlicmFyeShsdWJyaWRhdGUpDQojbGlicmFyeShkaXJlY3RsYWJlbHMpDQojbGlicmFyeShNZXRyaWNzKQ0KbGlicmFyeSh0cmVlKQ0KbGlicmFyeShJU0xSKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiNsb2FkIGluIHdvcmtzcGFjZXMgZnJvbSBwcmV2aW9zIG1vZGVscw0KbG9hZCgnZW52LlJEYXRhJykgI2tubg0KbG9hZCgiZHRfZW52LlJkYXRhIikgI3JlZ3Jlc3Npb24gdHJlZQ0KbG9hZCgibXlfZW52LlJkYXRhIikgI2xpbmVhciByZWdyZXNzaW9uDQpsb2FkKCJuYWl2ZV9lbnYuUmRhdGEiKSAjbmFpdmUgbW9kZWwNCmBgYA0KDQojI19fQXRsYW50YSBIb3RlbF9fDQpgYGB7cn0NCiNiZXN0IG1vZGVscyBmb3IgaG90ZWwgMQ0KDQpiZXN0X25haXZlICNuYWl2ZSBtb2RlbA0KYmVzdF9tb2RlbF9saW4gICNsaW5lYXIgbW9kZWwNCmJlc3RfbW9kZWxfa25uICNrbm4NCmJlc3RfbW9kZWxfcnQgI3JlZ3Jlc3Npb24gdHJlZQ0KDQojY29tYmluZSBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gaGF2ZSBhIGRhdGFmcmFtZSBvZiBhbGwgcHJlZGljdGVkIGNhbmNlbGxhdGlvbiByYXRlcw0KDQpiZXN0X21vZGVsX2tubiRrbm5fcHJlZGljdF9jeGxfcmF0ZSA8LSAgYmVzdF9tb2RlbF9rbm4kcHJlZGljdF9jeGxfcmF0ZQ0KYmVzdF9tb2RlbF9ydCRydF9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX3J0JHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbmFpdmUkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSA8LSBiZXN0X25haXZlJHByZWRpY3RfY3hsX3JhdGUNCg0KDQpob3QxX2Jlc3RfZGYgPC0gbGVmdF9qb2luKGJlc3RfbmFpdmUsIGJlc3RfbW9kZWxfbGluLCBieSA9IGMoJ2RheXNfcHJpb3InLCAnc3RheV9kdCcsICdwcm9kdWN0X3R5cGUnKSkNCmhvdDFfYmVzdF9kZiA8LSBsZWZ0X2pvaW4oaG90MV9iZXN0X2RmLCBiZXN0X21vZGVsX2tubiwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQpob3QxX2Jlc3RfZGYgPC0gbGVmdF9qb2luKGhvdDFfYmVzdF9kZiwgYmVzdF9tb2RlbF9ydCwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQphdmdfc3Z2X3J0IDwtIHN1bShob3QxX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCkvc3VtKGhvdDFfYmVzdF9kZiRPVEIueCkNCg0KDQpob3QxX2Jlc3RfZGYgPC0gZGF0YS5mcmFtZShob3QxX2Jlc3RfZGYkdHJ1ZV9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUsIGhvdDFfYmVzdF9kZiRsaW5fcHJlZGljdF9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJGtubl9wcmVkaWN0X2N4bF9yYXRlLCBob3QxX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJE9UQi54LCBob3QxX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCwgaG90MV9iZXN0X2RmJGRheXNfcHJpb3IpDQoNCiNyZW5hbWUgY29sdW1ucw0KaG90MV9iZXN0X2RmJHRydWVfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi50cnVlX2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLm5haXZlX3ByZWRpY3RfY3hsX3JhdGUNCmhvdDFfYmVzdF9kZiRsaW5fcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLmxpbl9wcmVkaWN0X2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi5rbm5fcHJlZGljdF9jeGxfcmF0ZQ0KaG90MV9iZXN0X2RmJHJ0X3ByZWRpY3RfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi5ydF9wcmVkaWN0X2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYkT1RCIDwtIGhvdDFfYmVzdF9kZiRob3QxX2Jlc3RfZGYuT1RCLngNCmhvdDFfYmVzdF9kZiRPVEJfdG9fc3Vydml2ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLk9UQl90b19zdXJ2aXZlLngNCmhvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDwtIGhvdDFfYmVzdF9kZiRob3QxX2Jlc3RfZGYuZGF5c19wcmlvcg0KDQpgYGANCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIG9mIGFsbCB0byBmaW5kIHdlaWdodHMNCmFsbF9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSArIHJ0X3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGYpDQpzdW1tYXJ5KGFsbF9tb2QpDQpgYGANCg0KYGBge3J9DQojbmV3IHByZWRpY3Rpb24gZ2l2ZW4gYWJvdmUgd2VpZ2h0cw0KDQpob3QxX2Jlc3RfZGYkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjUwMzM3NjAgKyBob3QxX2Jlc3RfZGYkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDIyODUxMCArIGhvdDFfYmVzdF9kZiRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNDYzNzc1ICtob3QxX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjA0MDIyNjEpDQoNCg0KZXZhbChob3QxX2Jlc3RfZGYpDQpgYGANCg0KYGBge3J9DQojdHJ5IHRvIGRvIGJ5IGRpZmZlcmVudCBkYXlzIG9mIHdlZWsNCmhvdDFfYmVzdF9kZl9kcDEgPC0gaG90MV9iZXN0X2RmW2hvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDcsIF0gDQpob3QxX2Jlc3RfZGZfZHAyIDwtIGhvdDFfYmVzdF9kZltob3QxX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAxNCwgXQ0KaG90MV9iZXN0X2RmX2RwMyA8LSBob3QxX2Jlc3RfZGZbaG90MV9iZXN0X2RmJGRheXNfcHJpb3IgPD0gMjEsIF0NCmhvdDFfYmVzdF9kZl9kcDQgPC0gaG90MV9iZXN0X2RmW2hvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDI4LCBdDQpob3QxX2Jlc3RfZGZfZHA1IDwtIGhvdDFfYmVzdF9kZltob3QxX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAzMiwgXQ0KYGBgDQoNCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIGJhc2VkIG9uIGRpZmZlcmVudCBncm91cHMNCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90MV9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDEkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjg2MzY4MSArIGhvdDFfYmVzdF9kZl9kcDEkbGluX3ByZWRpY3RfY3hsX3JhdGUqMC4wMTc1NjggKyBob3QxX2Jlc3RfZGZfZHAxJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDc2NDU1ICtob3QxX2Jlc3RfZGZfZHAxJHJ0X3ByZWRpY3RfY3hsX3JhdGUqLTAuMDAyNTg2KQ0KDQpob3QxX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuODEzNjkzICsgaG90MV9iZXN0X2RmX2RwMiRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTQ3NjYgKyBob3QxX2Jlc3RfZGZfZHAyJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDAzNTIyICtob3QxX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMTMyODEpDQoNCmhvdDFfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAzJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC41ODkyODUxICsgaG90MV9iZXN0X2RmX2RwMyRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjEzMDM2ICsgaG90MV9iZXN0X2RmX2RwMyRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMzcxMjY0ICtob3QxX2Jlc3RfZGZfZHAzJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNDA4Njk2KQ0KDQpob3QxX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNCRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuNDcyNzQ2NSArIGhvdDFfYmVzdF9kZl9kcDQkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE5NTMwOCArIGhvdDFfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDQ4MDk1MiAraG90MV9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0ODA5NTIpDQoNCmhvdDFfYmVzdF9kZl9kcDUkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA1JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC41MDMzNzYwICsgaG90MV9iZXN0X2RmX2RwNSRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjI4NTEwICsgaG90MV9iZXN0X2RmX2RwNSRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNDYzNzc1ICtob3QxX2Jlc3RfZGZfZHA1JHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNDAyMjYxKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQpgYGB7cn0NCiNjaG9vc2UgbmFpdmUgYW5kIGxpbmVhcg0KYWxsX2RwMV9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAxKQ0Kc3VtbWFyeShhbGxfZHAxX21vZCkNCg0KYWxsX2RwMl9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAyKQ0Kc3VtbWFyeShhbGxfZHAyX21vZCkNCg0KYWxsX2RwM19tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAzKQ0Kc3VtbWFyeShhbGxfZHAzX21vZCkNCg0KYWxsX2RwNF9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHA0KQ0Kc3VtbWFyeShhbGxfZHA0X21vZCkNCg0KYWxsX2RwNV9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHA1KQ0Kc3VtbWFyeShhbGxfZHA1X21vZCkNCg0KYGBgDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDFfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MDY1ODMgKyBob3QxX2Jlc3RfZGZfZHAxJGxpbl9wcmVkaWN0X2N4bF9yYXRlKjAuMDI1NzYzKQ0KDQpob3QxX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuODIyNDgwMCArIGhvdDFfYmVzdF9kZl9kcDIkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDEyMDU1MCkNCg0KaG90MV9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjU3NjY1OTEgKyBob3QxX2Jlc3RfZGZfZHAzJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAyMDUwNTUpDQoNCmhvdDFfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC40NDUyODYxICsgaG90MV9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTczNjQ4KQ0KDQpob3QxX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuNDczMjc2NCArIGhvdDFfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE4MzYwOSApDQoNCg0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2RmX2RwMSxob3QxX2Jlc3RfZGZfZHAyLCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwMywgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDQsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA1LCBhbGwgPSBUUlVFKQ0KDQpldmFsKGhvdDFfYmVzdF9ncm91cGVkKQ0KYGBgDQoNCg0KYGBge3J9DQojY2hvb3NlIG5haXZlIGFuZCBrbm4NCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDFfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC44NjY0MTMzICsgaG90MV9iZXN0X2RmX2RwMSRrbm5fcHJlZGljdF9jeGxfcmF0ZSowLjA4NDM3NTcpDQoNCmhvdDFfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC44MTE4NjU0NCArIGhvdDFfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wMDAwNDU5MSkNCg0KaG90MV9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjU4MTEwMTMgKyBob3QxX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAzNDk0NTUpDQoNCmhvdDFfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC40NTU2MjcgKyBob3QxX2Jlc3RfZGZfZHA0JGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0MjA4MikNCg0KaG90MV9iZXN0X2RmX2RwNSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDUkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjQ3ODk1NDkgKyBob3QxX2Jlc3RfZGZfZHA1JGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0MTM4OTIgKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCmBgYHtyfQ0KI2Nob29zZSBydCBhbmQga25uDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90MV9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDEkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjA2NTY5NCArIGhvdDFfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4yNDkyNjMpDQoNCmhvdDFfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wODg4ODM4ICsgaG90MV9iZXN0X2RmX2RwMiRrbm5fcHJlZGljdF9jeGxfcmF0ZSowLjA5NTcxMTEpDQoNCmhvdDFfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAzJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNzk5ODUgKyBob3QxX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDY1Mjg5KQ0KDQpob3QxX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDY5MDM2NiArIGhvdDFfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wNDUxNzEyKQ0KDQpob3QxX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDUyNzI4NyArIGhvdDFfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wNDE4MDgwKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCi0gTGluZWFyIFJlZ3Jlc3Npb24gYW5kIG5haXZlIHJlc3VsdHMgaW4gdGhlIGJlc3QgbW9kZWwNCg0KDQojI19fTlkgSG90ZWxfXw0KYGBge3J9DQojYmVzdCBtb2RlbHMgZm9yIGhvdGVsIDINCg0KYmVzdF9uYWl2ZV9ob3QyICNuYWl2ZSBtb2RlbA0KYmVzdF9tb2RlbF9saW5faG90MiAgI2xpbmVhciBtb2RlbA0KYmVzdF9tb2RlbF9rbm5faG90MiAja25uDQpiZXN0X21vZGVsX3J0X2hvdDIgI3JlZ3Jlc3Npb24gdHJlZQ0KDQojY29tYmluZSBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gaGF2ZSBhIGRhdGFmcmFtZSBvZiBhbGwgcHJlZGljdGVkIGNhbmNlbGxhdGlvbiByYXRlcw0KDQpiZXN0X21vZGVsX2tubl9ob3QyJGtubl9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX2tubl9ob3QyJHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbW9kZWxfcnRfaG90MiRydF9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX3J0X2hvdDIkcHJlZGljdF9jeGxfcmF0ZQ0KYmVzdF9uYWl2ZV9ob3QyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgPC0gYmVzdF9uYWl2ZV9ob3QyJHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbW9kZWxfbGluX2hvdDIkbGluX3ByZWRpY3RfY3hsX3JhdGUgPC0gYmVzdF9tb2RlbF9saW5faG90MiRwcmVkaWN0X2N4bF9yYXRlDQoNCg0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihiZXN0X25haXZlX2hvdDIsIGJlc3RfbW9kZWxfbGluX2hvdDIsIGJ5ID0gYygnZGF5c19wcmlvcicsICdzdGF5X2R0JywgJ3Byb2R1Y3RfdHlwZScpKQ0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihob3QyX2Jlc3RfZGYsIGJlc3RfbW9kZWxfa25uX2hvdDIsIGJ5ID0gYygnZGF5c19wcmlvcicsICdzdGF5X2R0JywgJ3Byb2R1Y3RfdHlwZScpKQ0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihob3QyX2Jlc3RfZGYsIGJlc3RfbW9kZWxfcnRfaG90MiwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQphdmdfc3Z2X3J0IDwtIHN1bShob3QyX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCkvc3VtKGhvdDJfYmVzdF9kZiRPVEIueCkNCg0KDQoNCmhvdDJfYmVzdF9kZiA8LSBkYXRhLmZyYW1lKGhvdDJfYmVzdF9kZiR0cnVlX2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSwgaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUsIGhvdDJfYmVzdF9kZiRydF9wcmVkaWN0X2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYkT1RCLngsIGhvdDJfYmVzdF9kZiRPVEJfdG9fc3Vydml2ZS54LCBob3QyX2Jlc3RfZGYkZGF5c19wcmlvcikNCg0KI3JlbmFtZSBjb2x1bW5zDQpob3QyX2Jlc3RfZGYkdHJ1ZV9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLnRydWVfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYubmFpdmVfcHJlZGljdF9jeGxfcmF0ZQ0KaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYubGluX3ByZWRpY3RfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRrbm5fcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLmtubl9wcmVkaWN0X2N4bF9yYXRlDQpob3QyX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLnJ0X3ByZWRpY3RfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRPVEIgPC0gaG90Ml9iZXN0X2RmJGhvdDJfYmVzdF9kZi5PVEIueA0KaG90Ml9iZXN0X2RmJE9UQl90b19zdXJ2aXZlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYuT1RCX3RvX3N1cnZpdmUueA0KaG90Ml9iZXN0X2RmJGRheXNfcHJpb3IgPC0gaG90Ml9iZXN0X2RmJGhvdDJfYmVzdF9kZi5kYXlzX3ByaW9yDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI3J1biBsaW5lYXIgcmVncmVzc2lvbiBvZiBhbGwgdG8gZmluZCB3ZWlnaHRzDQphbGxfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmKQ0Kc3VtbWFyeShhbGxfbW9kKQ0KYGBgDQoNCmBgYHtyfQ0KI25ldyBwcmVkaWN0aW9uIGdpdmVuIGFib3ZlIHdlaWdodHMNCg0KaG90Ml9iZXN0X2RmJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4wNTg5MjA4ICsgaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAxOTA5NTIgKyBob3QyX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDgxNjYxMCAraG90Ml9iZXN0X2RmJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMDUwMDg3KQ0KDQoNCmV2YWwoaG90Ml9iZXN0X2RmKQ0KYGBgDQoNCg0KYGBge3J9DQojdHJ5IHRvIGRvIGJ5IGRpZmZlcmVudCBkYXlzIG9mIHdlZWsNCmhvdDJfYmVzdF9kZl9kcDEgPC0gaG90Ml9iZXN0X2RmW2hvdDJfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDcsIF0gDQpob3QyX2Jlc3RfZGZfZHAyIDwtIGhvdDJfYmVzdF9kZltob3QyX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAxNCwgXQ0KaG90Ml9iZXN0X2RmX2RwMyA8LSBob3QyX2Jlc3RfZGZbaG90Ml9iZXN0X2RmJGRheXNfcHJpb3IgPD0gMjEsIF0NCmhvdDJfYmVzdF9kZl9kcDQgPC0gaG90Ml9iZXN0X2RmW2hvdDJfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDI4LCBdDQpob3QyX2Jlc3RfZGZfZHA1IDwtIGhvdDJfYmVzdF9kZltob3QyX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAzMiwgXQ0KYGBgDQoNCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIGJhc2VkIG9uIGRpZmZlcmVudCBncm91cHMNCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDJfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MzQ3NTEgKyBob3QyX2Jlc3RfZGZfZHAxJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwMzk2OCArIGhvdDJfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDQ5MDQwICtob3QyX2Jlc3RfZGZfZHAxJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMjYxODgpDQoNCmhvdDJfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4zMDkwODIgKyBob3QyX2Jlc3RfZGZfZHAyJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwNTg5MiArIGhvdDJfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMzAzMjE0ICtob3QyX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqLTAuMDcxODc1KQ0KDQpob3QyX2Jlc3RfZGZfZHAzJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMyRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMjYwNjYyMiArIGhvdDJfYmVzdF9kZl9kcDMkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE3NDM5NiArIGhvdDJfYmVzdF9kZl9kcDMka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMzIzNDU3MSAraG90Ml9iZXN0X2RmX2RwMyRydF9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwNzA1MzApDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4xMDcxMjQyICsgaG90Ml9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTk1MzA4ICsgaG90Ml9iZXN0X2RmX2RwNCRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4xMzc5NjA0ICtob3QyX2Jlc3RfZGZfZHA0JHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMDA5MTgxKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMDU4OTIwOCArIGhvdDJfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE5MDk1MiArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDgxNjYxMCAraG90Ml9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDA1MDA4NykNCg0KDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZGZfZHAxLGhvdDJfYmVzdF9kZl9kcDIsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHAzLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNCwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDUsIGFsbCA9IFRSVUUpDQoNCg0KDQoNCmV2YWwoaG90Ml9iZXN0X2dyb3VwZWQpDQpgYGANCmBgYHtyfQ0KI2Nob29zZSBuYWl2ZSBhbmQgbGluZWFyDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90Ml9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDEkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjkwODY4OSArIGhvdDJfYmVzdF9kZl9kcDEkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDA0NDk1KQ0KDQpob3QyX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMDA3MjAyICsgaG90Ml9iZXN0X2RmX2RwMiRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTgwODUpDQoNCmhvdDJfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAzJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45NjM2NDA5MCArIGhvdDJfYmVzdF9kZl9kcDMkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDI4NTcyOTEpDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45NzIzOTkyICsgaG90Ml9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjg3NzYyKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuOTgwNzgxNiArIGhvdDJfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDI1Njk4MCApDQoNCg0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2RmX2RwMSxob3QyX2Jlc3RfZGZfZHAyLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwMywgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDQsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHA1LCBhbGwgPSBUUlVFKQ0KDQpldmFsKGhvdDJfYmVzdF9ncm91cGVkKQ0KYGBgDQoNCg0KYGBge3J9DQojY2hvb3NlIG5haXZlIGFuZCBrbm4NCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDJfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MDI5MjE5ICsgaG90Ml9iZXN0X2RmX2RwMSRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNTcwMTA4KQ0KDQpob3QyX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMTM5Mjk0MSArIGhvdDJfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMjI3NzE5NikNCg0KaG90Ml9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSoxLjEzMTg3NDkgKyBob3QyX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjIzOTMzOTkpDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4wMzA3MTc4ICsgaG90Ml9iZXN0X2RmX2RwNCRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4xMTE4OTQ4KQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuOTk0MDk2OCArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDYzNjA5NykNCg0KDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZGZfZHAxLGhvdDJfYmVzdF9kZl9kcDIsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHAzLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNCwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDUsIGFsbCA9IFRSVUUpDQoNCmV2YWwoaG90Ml9iZXN0X2dyb3VwZWQpDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2Nob29zZSBydCBhbmQga25uDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90Ml9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDEkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjIxMDk1MCArIGhvdDJfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqMC40NzgyOTApDQoNCmhvdDJfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4zMTM2OTcgKyBob3QyX2Jlc3RfZGZfZHAyJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuNDI2MzU1KQ0KDQpob3QyX2Jlc3RfZGZfZHAzJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMyRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTU0MDU0OSArIGhvdDJfYmVzdF9kZl9kcDMka25uX3ByZWRpY3RfY3hsX3JhdGUqMC40ODk1NDI4KQ0KDQpob3QyX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTIxMTYyNiArIGhvdDJfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqMC41MTQzNDUwKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTE1MjQ2NyArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqMC41MjY1MjUyKQ0KDQoNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9kZl9kcDEsaG90Ml9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QyX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCg==